package com.example.forum.dao;

import com.example.forum.model.Article;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface ArticleMapper {
    int insert(Article row);

    int insertSelective(Article row);

    Article selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(Article row);

    int updateByPrimaryKeyWithBLOBs(Article row);

    int updateByPrimaryKey(Article row);

    /**
     * 查询所有文章
     * @return
     */
    List<Article> selectAll();
    
    /**
     * 查询所有文章（带用户信息）
     * @return 带用户信息的文章列表
     */
    List<Article> selectAllWithUserInfo();

    /**
     * 根据板块id 查询该板块未被删除的所有文章
     * @param boardId  板块id
     * @return
     */
    List<Article> selectAllByBoardId(@Param("boardId") Long boardId);
    
    /**
     * 根据板块id查询该板块未被删除的所有文章（带用户信息）
     * @param boardId 板块id
     * @return 带用户信息的文章列表
     */
    List<Article> selectAllByBoardIdWithInfo(@Param("boardId") Long boardId);

    /**
     * 根据文章id 查询文章的详细信息
     * @param id  文章id
     * @return  查询到的文章详情
     */
    Article selectDetailById(@Param("id") Long id);
    
    /**
     * 根据文章id查询文章的详细信息（带用户和板块信息）
     * @param id 文章id
     * @return 带完整信息的文章详情
     */
    Article selectDetailByIdWithInfo(@Param("id") Long id);

    /**
     * 根据用户id查询所有文章（带分页）
     * @param userId  用户id
     * @param offset  起始位置
     * @param limit   每页数量
     * @return  分页后的文章列表
     */
    List<Article> selectByUserId(@Param("userId") Long userId, @Param("offset") Integer offset, @Param("limit") Integer limit);
    
    /**
     * 根据用户id查询所有文章（带板块信息和分页）
     * @param userId 用户id
     * @param offset 起始位置
     * @param limit 每页数量
     * @return 带板块信息的分页文章列表
     */
    List<Article> selectByUserIdWithInfo(@Param("userId") Long userId, @Param("offset") Integer offset, @Param("limit") Integer limit);
    
    /**
     * 统计用户的文章总数
     * @param userId 用户ID
     * @return 该用户的文章总数
     */
    Integer countUserArticles(@Param("userId") Long userId);

    /**
     * 统计总文章数（未删除的）
     * @return 文章总数
     */
    int countTotalArticles();

    /**
     * 统计今日新增文章数
     * @return 今日新增文章数
     */
    int countTodayNewArticles();
    
    /**
     * 管理员获取所有未删除的文章列表
     * @return 所有未删除的文章列表
     */
    List<Article> getAllArticles();
    
    /**
     * 管理员分页查询文章列表
     * @param offset 偏移量
     * @param limit 每页数量
     * @param keyword 关键词搜索
     * @param status 状态筛选
     * @param sort 排序字段
     * @param order 排序方向
     * @return 分页文章列表
     */
    List<Article> getArticlesByPage(
        @Param("offset") Integer offset, 
        @Param("limit") Integer limit,
        @Param("keyword") String keyword,
        @Param("status") String status,
        @Param("sort") String sort,
        @Param("order") String order
    );
    
    /**
     * 统计符合条件的文章总数
     * @param keyword 关键词搜索
     * @param status 状态筛选
     * @return 文章总数
     */
    int countArticlesByCondition(
        @Param("keyword") String keyword,
        @Param("status") String status
    );
    
    /**
     * 管理员更新文章状态
     * @param articleId 文章ID
     * @param state 状态(0正常, 1禁用)
     * @return 受影响的行数
     */
    int updateArticleState(@Param("articleId") Long articleId, @Param("state") Byte state);
    
    /**
     * 统计用户的评论数
     * @param userId 用户ID
     * @return 用户的评论总数
     */
    Integer countUserComments(@Param("userId") Long userId);
    
    /**
     * 统计用户获得的点赞数
     * @param userId 用户ID
     * @return 用户获得的点赞总数
     */
    Integer countUserLikes(@Param("userId") Long userId);

    /**
     * 统计所有文章的访问量总和
     * @return 总访问量
     */
    Integer countTotalVisits();

    /**
     * Count the number of non-deleted articles in a specific board
     * @param boardId the board ID
     * @return the count of active articles in the board
     */
    int countArticlesByBoardId(Long boardId);
}